package com.misty.java8;

import org.junit.Test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.IntStream;
import java.util.stream.Stream;

//https://www.jianshu.com/p/e429c517e9cb 参考链接

public class Test2 {
    private static List<Person> persons;

    static {
        persons = Demo.persons;
    }

    /*流与数值流的的转换
    mapToInt(T -> int) : return IntStream
    mapToDouble(T -> double) : return DoubleStream
    mapToLong(T -> long) : return LongStream*/
    @Test
    public void test1() {
        IntStream intStream = persons.stream().mapToInt(Person::getAge);
        IntStream intStream2 = persons.stream().mapToInt(Person::getAge);
        IntStream intStream3 = persons.stream().mapToInt(Person::getAge);
        IntStream intStream4 = persons.stream().mapToInt(Person::getAge);
        System.out.println(intStream.sum());
        System.out.println(intStream2.max());
        System.out.println(intStream3.min());
        System.out.println(intStream4.average());

    }

    /**
     * Optional 类
     * NullPointerException 可以说是每一个 Java 程序员都非常讨厌看到的一个词，针对这个问题， Java 8 引入了一个新的容器类 Optional，可以代表一个值存在或不存在，这样就不用返回容易出问题的 null。之前文章的代码中就经常出现这个类，也是针对这个问题进行的改进。
     * <p>
     * Optional 类比较常用的几个方法有：
     * <p>
     * isPresent() ：值存在时返回 true，反之 flase
     * get() ：返回当前值，若值不存在会抛出异常
     * orElse(T) ：值存在时返回该值，否则返回 T 的值
     * Optional 类还有三个特化版本 OptionalInt，OptionalLong，OptionalDouble，刚刚讲到的数值流中的 max 方法返回的类型便是这个
     */
    @Test
    public void test2() {
        Optional<Integer> sum = persons.stream().map(Person::getAge).reduce(Integer::sum);

        if (sum.isPresent()) { //值存在的时候返回true
            int sumValue = sum.get();
            System.out.println(sumValue);
        } else {
            int otherValue = sum.orElse(-1);//值存在的时候返回该值否则返回另一个值
            System.out.println(otherValue);
        }
    }

    /**
     * 构建流
     */
    @Test
    public void test3() {
        //1.值构建流(注意泛型)
        Stream<String> stream = Stream.of("aaa", "bbb", "ccc");
        //2.生成空流
        Stream.empty();
        //3.数组构建流
        int[] array = {1, 2, 3, 4, 5, 6};
        Arrays.stream(array);
        //值得注意的是，还可以规定只取数组的某部分，
        Arrays.stream(array, 1, 3);

        try {
            // 4. 文件生成流，每个元素是文件的其中一行
            Files.lines(Paths.get("filepath.txt"));
            // 5. 每一个元素是一个文件名
            Stream<Path> pathStream = Files.list(Paths.get("dir"));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
